package Shifu.MainServer.Net;

import java.io.*;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.lang.Thread;

/**
 * Shell che viene avviata sul client dopo
 * che il PeerServer è stato esportato
 */

public class LeecherShell extends Thread implements Serializable {

	protected String id = ""; //id del Peer
	protected LeecherShellPeerServer peerserverstub;	//stub per il peerserver
	protected boolean online = false;	//Indica se il sistema è registato al mainserver
	protected InputStreamReader is = null;

	/**
         * Costruttore
	 * @param id l'id del peer
         */

	public LeecherShell(String id) {
		this.id = id;
	}

	/**
	 * Setta lo stub per il peerserver
	 * @peerserverstub lo stub per il peerserver
	 */

	public void setPeerServerStub(LeecherShellPeerServer peerserverstub) {
		this.peerserverstub = peerserverstub;
	}


	/**
	 * Comandi eseguiti una volta avviata la shell
	 */	
	
	public void run() {

		this.printLogo();			
		this.getCommand();		//avvia la routine per la gestione dei comandi
	}

	/**
	 * Prende i comandi da console, gli verifica e nel caso gli esegue
	 */	

	public void getCommand() {

		//InputStreamReader is = null; //input stream

		try {
		
			if(is == null)
				is = new InputStreamReader(System.in);

			BufferedReader buffer = new BufferedReader(is);
			String command = "";	//comando


			/* continua fino a che non viene dato il comando exit */
			while(!command.equals("exit")) {

				System.out.print("Shifu>");
				command = buffer.readLine();
				
				// Discriminazione del comando dato

				if (command.equals("help")) {
					this.help();
				}

				else if (command.equals("id")) {
					this.id();
				}

				else if (command.equals("download")) {
					System.out.println("Richiesta download file");
					this.download();
				}

				else if (command.equals("filelist")) {
					System.out.println("Richiesta lista file");
					this.fileList();
				}

				else if (command.equals("peerlist")) {
					System.out.println("Richiesta lista peer");
					this.peerList();
				}

				else if (command.equals("online")) {
					int val = this.online();
					System.out.println("Sistema online: "+val);
				}

				else if (command.equals("exit")) {
					System.out.println("Arrivederci :-) ");
					this.exit();
				}

				else if (command.equals("upgrade")) {
					System.out.println("Upgrade avviato");
					this.upgrade();
					break;				//esce dal ciclo
					
				}
				else {
					System.out.println("Shifu: Comando sconosciuto. Guarda l'help !");
				}
				
			} 

		} catch (IOException ioe) {
		 	System.out.println("Errore nel'input da tastiera "+ioe.getMessage());
			ioe.printStackTrace();
		}

	/**	finally {		

			try {	
				is.close();	
			} catch (IOException ioe) {
				System.out.println("LeecherShell:Errore nella chiusura dell'input stream");
			}
		}
*/	}

	/**
	 * Stampa il logo a seconda del tipo di shell
         */	

	public void printLogo() {
		
		System.out.println("\n\n***************************");
		System.out.println("**     Leecher Shell     **");
		System.out.println("***************************\n");
		System.out.print("Status ID: "+this.id+" \n\n");
	}


	/**
         * Stampa l'help
         */

	public void help() {
		
		System.out.println("\nHELP: \n\n* id\n* help\n* filelist\n* online\n* peerlist\n* download\n* upgrade\n* exit\n");
	}

	/**
         * Stampa l'id
         */

	public void id() {
		System.out.println("Il tuo id è: "+this.id);
	}

	/**
         * Fa la richiesta per il download del file
         */

	public void download() {

		is = null;

		try {
			fileList();
			System.out.print("Inserisci il numero del file da scaricare: ");
			is = new InputStreamReader(System.in);
			BufferedReader buffer = new BufferedReader(is);
			String val = buffer.readLine();
			if (!val.equals("")) {
				int index = Integer.parseInt(val);
				int result = peerserverstub.download(index);
				if(result > 0) System.out.println("Shifu: Download completato !");
				else System.out.println("Shifu: Download fallito, il file potrebbe non essere più disponibile");
			}

		} catch (IOException io) {
			System.out.println("Shifu> Errore di IO ! "+io.getMessage());
		}

		/*finally {

			try {
				is.close();	
			} catch (IOException io) {
				System.out.println("Shifu> Errore di IO ! "+io.getMessage());
			}

		}*/
	}

	/**
         * Mostra la lista dei peers collegati al sistema
         */

	public void peerList() throws RemoteException {
		String peerlist = peerserverstub.peerList();
		System.out.println("\n**ELENCO PEER**\n"+peerlist);
	}

	/**
         * Mostra la lista dei file presenti sul sistema
         */
	
	public void fileList() throws RemoteException {
		String filelist = peerserverstub.fileList();
		System.out.println("\n**ELENCO FILE**\n\n"+filelist);
	}

	/**
         * Si registra e si mette disponibile per il sistema
         * @return 1 se ha avuto successo, -1 altrimenti
         */
	
	public int online() throws RemoteException {
		
		if(online == true) {
			System.out.println("Shifu> Errore risulti gia online");
			return -1;
		}

		this.online = true;
		return peerserverstub.registrate(id);
	}

	/**
         * Esegue l'aggiornamento della shell una volta
	 * che è stata ricevuta la promozione
         */

	public void upgrade() throws RemoteException {
		peerserverstub.upgrade();
	}
	

	/**
         * Esce del sistema 
         */
	
	public void exit() throws RemoteException {
		System.out.println("Chiusura del sistema");
		peerserverstub.exit();
	}
}
